#!/usr/bin/python
# -*- coding: utf-8 -*-
#coding=utf-8
import os
import zlib
import encryptDemo
import datetimeDemo as tsLog
import fileDemo
def makeZipBytes(strOrBytes):
    if isinstance(strOrBytes, str):
        strBytes = strOrBytes.encode('utf-8')
        return zlib.compress(strBytes)
    elif isinstance(strOrBytes, bytes):
        return zlib.compress(strOrBytes)
    else:
        return None

def unzipBytes(compressedBytes):
    # 使用zlib 做 解压缩
    if isinstance(compressedBytes, bytes):
        return zlib.decompress(compressedBytes)
    else:
        return None

def unzipBytes2Str(compressedBytes):
    # 使用zlib 做 解压缩
    if isinstance(compressedBytes, bytes):
        strBytes = zlib.decompress(compressedBytes)
        return strBytes.decode('utf-8')
    else:
        return None

def strBytesZipUnZipDemo():
    print("\nstrBytesZipUnZipDemo")

    oStr = """
七律·长征
毛泽东
1935年10月
红军不怕远征难，万水千山只等闲
五岭逶迤腾细浪，乌蒙磅礴走泥丸。
金沙水拍云崖暖，大渡桥横铁索寒。
更喜岷山千里雪，三军过后尽开颜。
 
水调歌头·明月几时有
苏轼
丙辰中秋，欢饮达旦，大醉，作此篇，兼怀子由。
 
明月几时有？把酒问青天。
不知天上宫阙，今夕是何年。
我欲乘风归去，又恐琼楼玉宇，高处不胜寒。
起舞弄清影，何似在人间。
 
转朱阁，低绮户，照无眠。
不应有恨，何事长向别时圆？
人有悲欢离合，月有阴晴圆缺，此事古难全。
但愿人长久，千里共婵娟。
 
琵琶行
浔阳江头夜送客，枫叶荻花秋瑟瑟。
主人下马客在船，举酒欲饮无管弦。
醉不成欢惨将别，别时茫茫江浸月。
忽闻水上琵琶声，主人忘归客不发。
寻声暗问弹者谁，琵琶声停欲语迟。
移船相近邀相见，添酒回灯重开宴。
千呼万唤始出来，犹抱琵琶半遮面。
转轴拨弦三两声，未成曲调先有情。
弦弦掩抑声声思，似诉平生不得志。
低眉信手续续弹，说尽心中无限事。
轻拢慢捻抹复挑，初为《霓裳》后《六幺》。
大弦嘈嘈如急雨，小弦切切如私语。
嘈嘈切切错杂弹，大珠小珠落玉盘。
间关莺语花底滑，幽咽泉流冰下难。
冰泉冷涩弦凝绝，凝绝不通声暂歇。
别有幽愁暗恨生，此时无声胜有声。
银瓶乍破水浆迸，铁骑突出刀枪鸣。
曲终收拨当心画，四弦一声如裂帛。
东船西舫悄无言，唯见江心秋月白。
沉吟放拨插弦中，整顿衣裳起敛容。
自言本是京城女，家在虾蟆陵下住。
十三学得琵琶成，名属教坊第一部。
曲罢曾教善才服，妆成每被秋娘妒。
五陵年少争缠头，一曲红绡不知数。
钿头银篦击节碎，血色罗裙翻酒污。
今年欢笑复明年，秋月春风等闲度。
弟走从军阿姨死，暮去朝来颜色故。
门前冷落鞍马稀，老大嫁作商人妇。
商人重利轻别离，前月浮梁买茶去。
去来江口守空船，绕船月明江水寒。
夜深忽梦少年事，梦啼妆泪红阑干。
我闻琵琶已叹息，又闻此语重唧唧。
同是天涯沦落人，相逢何必曾相识！
我从去年辞帝京，谪居卧病浔阳城。
浔阳地僻无音乐，终岁不闻丝竹声。
住近湓江地低湿，黄芦苦竹绕宅生。
其间旦暮闻何物？杜鹃啼血猿哀鸣。
春江花朝秋月夜，往往取酒还独倾。
岂无山歌与村笛？呕哑嘲哳难为听。
今夜闻君琵琶语，如听仙乐耳暂明。
莫辞更坐弹一曲，为君翻作《琵琶行》。
感我此言良久立，却坐促弦弦转急。
凄凄不似向前声，满座重闻皆掩泣。
座中泣下谁最多？江州司马青衫湿。
"""

    print("oStr:", type(oStr), len(oStr))
    strBytes = oStr.encode('utf-8')
    print("strBytes:", type(strBytes), len(strBytes))

    # 压缩得到 bytes
    zipBytes = makeZipBytes(oStr)
    print("zipBytes:", type(zipBytes), len(zipBytes), "压缩率", (len(strBytes)-len(zipBytes))/len(strBytes))

    # 压缩得到 bytes 编码成 base64 可以输出看
    zipBase64Str = encryptDemo.makeBase64Str(zipBytes)
    print("zipBase64Str:", type(zipBase64Str), len(zipBase64Str), "压缩率", (len(strBytes)-len(zipBase64Str))/len(strBytes))

    # 解压缩 还原为str
    unzipStr = unzipBytes2Str(zipBytes)
    print("unzipStr == oStr ? ", unzipStr == oStr)

def fileZipUnZipDemo():
    print("\nfileZipUnZipDemo")

    currentDirectory = fileDemo.check2CreateWorkDir()
    poemFilePath = os.path.join(currentDirectory, "poem.txt")
    poemZipFilePath = os.path.join(currentDirectory, "poem.testzip")

    # 使用 zlib 压缩一个本地文件 a 压缩后的结果存放在文件 b 中
    with open(poemFilePath, 'rb') as fr:
        data = fr.read()
        print("data read:", type(data), len(data), poemFilePath)
        fr.close()

    compressed_data = zlib.compress(data)
    print("compressed_data:", type(compressed_data), len(compressed_data), "压缩率",
          (len(data) - len(compressed_data)) / len(data))

    with open(poemZipFilePath, 'wb') as fw:
        fw.write(compressed_data)
        print("data write:", poemZipFilePath)
        fw.close()

    # 读取 刚才准备好的压缩文件
    with open(poemZipFilePath, 'rb') as fr:
        zipData = fr.read()
        print("zipData read:", type(zipData), len(zipData), poemZipFilePath)

        print("zipData == data ? ", zipData == data)

        unzipData = zlib.decompress(zipData)
        print("unzipData == data ? ", unzipData == data)

        unzipStr = unzipData.decode('utf-8')
        print("unzipStr", type(unzipStr), len(unzipStr))

        with open(poemFilePath, 'r') as fp:
            poemStr = fp.read()
            print("poemStr", type(poemStr), len(poemStr), poemZipFilePath)
            print("unzipStr == poemStr ? ", unzipStr == poemStr)
            fp.close()

        fr.close()


def demo():
    tsLog.logTs("zipDemo", preNewLineNum=2)

    strBytesZipUnZipDemo()
    fileZipUnZipDemo()

if __name__ == '__main__':
    demo()